const fs = require('fs')
const path = require('path')
const mysql = require('mysql2/promise')
const config = require('./config')

async function initializeDatabase () {
  console.log('开始初始化数据库...')

  try {
    // 连接到MySQL（不指定数据库）
    const connection = await mysql.createConnection({
      host: config.database.host,
      port: config.database.port,
      user: config.database.user,
      password: config.database.password
    })

    // 首先检查数据库是否存在
    const dbName = config.database.name
    await connection.query(`CREATE DATABASE IF NOT EXISTS ${dbName}`)
    await connection.query(`USE ${dbName}`)

    // 检查关键表是否已存在
    const [tables] = await connection.query(`SHOW TABLES LIKE 'users'`)

    if (tables.length > 0) {
      console.log('✅ 数据库已初始化，跳过表创建')
      await connection.end()
      return true
    }

    console.log('📝 开始创建数据库表...')

    // 读取并执行SQL脚本
    const sqlScript = fs.readFileSync(
      path.join(__dirname, 'init-database.sql'),
      'utf8'
    )

    // 分割SQL语句，处理多行语句
    const statements = sqlScript
      .split(';')
      .map(stmt => stmt.trim())
      .filter(stmt => stmt && !stmt.startsWith('--'))

    for (const statement of statements) {
      if (statement.trim()) {
        try {
          await connection.query(statement)
          console.log('✅ 执行SQL语句成功')
        } catch (error) {
          // 忽略表已存在的错误
          if (error.code === 'ER_TABLE_EXISTS_ERROR') {
            console.log('⚠️  表已存在，跳过创建')
            continue
          }
          console.error('❌ SQL执行失败:', error.message)
          throw error
        }
      }
    }

    console.log('数据库初始化完成！')
    await connection.end()

    return true
  } catch (error) {
    console.error('数据库初始化失败:', error)
    return false
  }
}

async function checkEnvFile () {
  const envPath = path.join(__dirname, '.env')

  if (!fs.existsSync(envPath)) {
    console.log('创建 .env 文件...')

    const envContent = `# 环境配置
NODE_ENV=development

# 服务器配置
PORT=3000
HOST=localhost

# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=
DB_NAME=novel_platform

# JWT配置
JWT_SECRET=your-jwt-secret-key-please-change-in-production
JWT_EXPIRES_IN=7d

# 文件上传配置
UPLOAD_PATH=uploads
MAX_FILE_SIZE=5242880

# 支付配置（开发环境可以留空）
ALIPAY_APP_ID=
ALIPAY_PRIVATE_KEY=
ALIPAY_PUBLIC_KEY=
WECHAT_APP_ID=
WECHAT_APP_SECRET=

# 邮件配置（开发环境可以留空）
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASS=`

    fs.writeFileSync(envPath, envContent)
    console.log('.env 文件已创建，请根据需要修改数据库密码等配置')
  }
}

async function start () {
  console.log('小说阅读平台后端启动中...')

  // 检查并创建 .env 文件
  await checkEnvFile()

  // 加载环境变量
  require('dotenv').config()

  // 创建上传目录
  const uploadDir = path.join(__dirname, 'uploads')
  if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true })
    console.log('创建上传目录:', uploadDir)
  }

  // 初始化数据库
  try {
    await initializeDatabase()
    console.log('✅ 数据库初始化完成')
  } catch (error) {
    console.error('❌ 数据库初始化失败:', error.message)
    console.log('⚠️  将跳过数据库初始化，继续启动服务器...')
  }

  // 启动服务器
  console.log('启动Express服务器...')
  const app = require('./app.js')

  // 如果app.js导出了startServer函数，则调用它
  if (typeof app.startServer === 'function') {
    await app.startServer()
  } else {
    // 否则手动启动服务器
    const PORT = process.env.PORT || 3000
    const HOST = process.env.HOST || '0.0.0.0'
    const server = app.listen(PORT, HOST, () => {
      console.log('\n🎉 橘子小说服务器启动成功！')
      console.log(`📍 本地地址: http://localhost:${PORT}`)
      console.log(`📍 网络地址: http://192.168.1.103:${PORT}`)
      console.log(`🔍 健康检查: http://localhost:${PORT}/health`)
      console.log('\n✨ 橘子小说，让阅读更精彩！\n')
    })
  }
}

start().catch(console.error)
